#pragma once
#include <iostream>
#include <cstring>

namespace evaluation{
    struct ArgType
    {
        std::string input_folder;  // 输入文件夹
        std::string type_of_file = "pcd"; // 点云面片的后缀名

        float min_inliers_percent = 0.9; //与点云平面噪声大小有关
        float dis_threshold = 2.0;  //与点云平面的厚度有关
        float search_step = 0.01;  //搜索拟合平面的步长，影响准确度和运行时间
        int skip_line = 0; //跳过点云中的行数，读txt文件时才需要设置
    };

    class ArgParser
    {
    private:
        ArgType args;

    public:
        void printHelp()
        {
        std::cout << "Usage: ./evaluation_precision [参数选项][参数值]" << std::endl
                << "参数选项 : 参数值代表的含义"  << std::endl
                << "--help : 打印本条帮助" << std::endl
                << "-f : 点云所在的文件夹" << std::endl
                << "-d : 预计点云平面的最大厚度，默认2米\n\t说明：若最终结果中点云数量少于指定文件夹中的点云数，则说明部分点云的厚度超过了最大厚度，需要检查点云或适当增大这个最大厚度参数。" << std::endl
                << "-s : 搜索拟合平面的步长，影响运行时间和拟合准确度，默认0.01" << std::endl
                << "-k : 跳过点云文件的前k行，一般不需要设置" << std::endl;
        }
        
        ArgType& getArgs(){ return args;}

        bool parseArg(int argc, char** argv)
        {
            for(int i=1; i<argc; ++i)
            {
                const char* curArg = argv[i];
                if(strcmp(curArg, "--help") == 0) return false;
            
                if(strcmp(curArg, "-f") == 0)
                {
                    if(++i >= argc){
                        std::cout << "文件夹路径设置错误!" << std::endl;
                        return false;
                    }
                    args.input_folder = argv[i];
                    if(args.input_folder.rfind('/') == args.input_folder.size()-1)  //去掉末尾可能有的'/'
                        args.input_folder = args.input_folder.substr(0, args.input_folder.size()-1);
                }
                else if(strcmp(curArg, "-i") == 0)
                {
                    if(++i >= argc)
                    {
                        std::cout << "内点比例设置错误!" << std::endl;
                        return false;
                    }
                    args.min_inliers_percent = atof(argv[i]);
                }
                else if(strcmp(curArg, "-d") == 0)
                {
                    if(++i >= argc)
                    {
                        std::cout << "点云厚度设置错误！" << std::endl;
                        return false;
                    }
                    args.dis_threshold = atof(argv[i]);
                }
                else if(strcmp(curArg, "-s") == 0)
                {
                    if(++i >= argc)
                    {
                        std::cout << "搜索步长设置错误!" << std::endl;
                        return false;
                    }
                    args.search_step = atof(argv[i]);
                }
                else if(strcmp(curArg, "-k") == 0)
                {
                    if(++i >= argc)
                    {
                        std::cout << "省略点云文件的行数设置错误!" << std::endl;
                        return false;
                    }
                    args.skip_line = atoi(argv[i]);
                }
            }
        }
    };
}